package com.lj.sse.service;

import com.lj.sse.result.SseRecord;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;

/**
 * @author luojing
 * @since 2025/3/26 11:29
 * sse服务提供类
 */
public interface SseService {

    /**
     * 创建sse连接
     */
    default SseEmitter createSseConnect(){
        return createSseConnect(0, TimeUnit.SECONDS, null);
    }

    /**
     * 创建sse连接，可以定时执行consumer，可以在consumer中向客户端发送消息(模拟业务心跳)
     *
     * @param period   时间周期
     * @param unit     时间单位
     * @param consumer 要执行的方法
     */
    default SseEmitter createSseConnect(long period,
                                TimeUnit unit, Consumer<SseRecord> consumer){
        return createSseConnect(null, period, unit, consumer);
    }

    /**
     * 创建sse连接
     * @param clientId 客户端的连接id,可以防止重复创建连接(前端每刷新一次创建一个新连接)
     * @param period   时间周期
     * @param unit     时间单位
     * @param consumer 要执行的方法
     * @return
     */
    SseEmitter createSseConnect(String clientId, long period,
                                TimeUnit unit, Consumer<SseRecord> consumer);

    /**
     * 关闭指定用户的指定客户端
     */
    void closeSseConnect(Long userId, String clientId);
}
